import { Evented } from "../event/index";

/**
* 位标识类，每一个channel定义一个标识0或1，代表该位置是否存在标识。
* @class
* @memberof w
* @author jiangjinwei
*/
class Signal extends Evented {
    static size=24;
    /**
     * 位标识类
     * @constructor
     */
    constructor() {
        super();
        this.mask = 0|0;
    }
    /**
     * @method set
     * 将channel位标识设为1，其它均设置为0.
     * @param {Number} channel 设置为1的标识位。
     */
    set(channel) {
        if(valid(channel)){
            this.mask = (1 << channel | 0) >>> 0;
            return true;
        }
        return false;
        
    }
    /**
     * @method enable
     * 将channel位标识设为1，其它保持不变.
     * @param {Number} channel 设置为1的标识位。
     */
    enable(channel) {
        if(valid(channel)){
            this.mask |= 1 << channel | 0;
            return true;
        }
        return false;
        
    }
    /**
     * @method enableAll
     * 将所有位标识都设为1.
     */
    enableAll() {
        this.mask = 0xffff | 0;
    }
    /**
     * @method toggle
     * 将channel位标识取异或。
     */
    toggle(channel) {
        if(valid(channel)){
            this.mask ^= 1 << channel | 0;
            return true;
        }
        return false;
    }
    /**
     * @method disable
     * 将channel位标识设为0，其它保持不变.
     * @param {Number} channel 设置为1的标识位。
     */
    disable(channel) {
        if(valid(channel)){
            this.mask &= ~(1 << channel | 0);
            return true;
        }
        return false; 
    }
    /**
     * @method disableAll
     * 将所有位标识都设为0.
     */
    disableAll() {
        this.mask = 0;
    }
    /**
     * @method test
     * 测试2个signal是否相同。
     */
    test(signal) {
        return (this.mask & layers.mask) !== 0;
    }
    /**
     * @method isEnabled
     * 判断channel位是否为1。
     */
    isEnabled(channel) {
        return (this.mask & (1 << channel | 0)) !== 0;
    }
    valid(channel){
        return typeof num ==="number" && isFinite(num) && channel<Signal.size;
    }
}
export { Signal };
